package servidor.principal.control;

import java.rmi.server.UnicastRemoteObject;
import java.util.Collection;
import java.util.Iterator;
import java.util.Vector;

import javax.jdo.Extent;
import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManager;
import javax.jdo.PersistenceManagerFactory;
import javax.jdo.Query;
import javax.jdo.Transaction;

import servidor.dominio.Concepto;



import servidor.principal.control.*;
import servidor.principal.assembler.*;

import comun.dto.*;
import comun.iControl.*;


public class ControlConcepto extends UnicastRemoteObject implements IControlConcepto {

	public ControlConcepto() throws Exception{


	}



	public boolean addConceptoDTO(ConceptoDTO pDTO) throws Exception{ 
		PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory("jpox.properties");
		PersistenceManager pm = pmf.getPersistenceManager();
		Transaction tx=pm.currentTransaction();
		Concepto p = ConceptoAssembler.getConcepto(pDTO);
		if (this.existeConcepto(p.getDescripcion()))  		  
			return false;
		else{
			try{
				tx.begin();
				pm.makePersistent(p);
				tx.commit();
				System.out.println("Concepto dada de alta. OK");

			}
			finally
			{
				if (tx.isActive())
				{
					tx.rollback();
				}
				pm.close();
			} 
			return true;
		}

	} 




	public boolean existeConcepto(String descripcion)throws Exception{
		//ver como filtrar por cuil y nombre de la empresa a la que pertenece
		PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory("jpox.properties");
		PersistenceManager pm = pmf.getPersistenceManager();
		Transaction tx=pm.currentTransaction();
		tx = pm.currentTransaction();	        
		boolean existe = false;
		try {

			if (!tx.isActive())tx.begin();
			String filter = "descripcion == \""+descripcion+"\"";
			Collection conceptoCol= this.getObjects(pm,Concepto.class,filter);
			if (conceptoCol.size()>=1) 
				existe=true;

			try {
				tx.commit(); 
			} catch (RuntimeException e) {
				e.printStackTrace();
				return false;
			}
		} finally {


			if (tx.isActive()) tx.rollback();
		}
		return existe;


	}

	public void eliminarConcepto(String descripcion) throws Exception{
		// eliminar todos los datos de empleado tmb
		PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory("jpox.properties");
		PersistenceManager pm = pmf.getPersistenceManager();
		Transaction tx=pm.currentTransaction();
		try {
			tx.begin();
			if (!tx.isActive())tx.begin();   
			Concepto concepto = new Concepto();
			String filter = "descripcion == \""+descripcion+"\"";
			Collection ConceptoCol= this.getObjects(pm,Concepto.class,filter);

			Iterator<Concepto> iter = ConceptoCol.iterator();
			while (iter.hasNext()) {
				Concepto con = iter.next();
				ConceptoDTO conDTO = ConceptoAssembler.getConceptoDTO(con);
				pm.deletePersistent(con);
				//vector.add(clientDTO);
			}           
			/*
				    //Elimino la cta. cte.
					CuentaCorriente cta = cliente.getCuentaCorriente();
					Collection m = cta.getMovimientos();

					for (Iterator i = m.iterator(); i.hasNext(); ) {
						Movimiento movimiento = (Movimiento)i.next();
						this.persistencia.borrarObjeto(movimiento);
					}

					this.persistencia.borrarObjeto(cta);

					//Elimino las empresas
					Collection empresas = cliente.getEmpresas();
					for (Iterator i = empresas.iterator(); i.hasNext(); ) {
							Empresa empresa = (Empresa)i.next();

			                //Elimino el Plan de Cuenta
							PlanDeCuenta plan = empresa.getPlan();
							eliminarCuentas(plan.getCodigoEmpresa());
							this.persistencia.borrarObjeto(plan);

							//Elimino el Libro Diario
							LibroDiario diario = empresa.getLibroDiario();
							eliminarRegistros(diario.getCodigoEmpresa());
							this.persistencia.borrarObjeto(diario);

							this.persistencia.borrarObjeto(empresa);
					}*/

			//pm.deletePersistent(cliente);
			tx.commit();
			System.out.println("Concepto Eliminado. OK");

			//this.persistencia.borrarObjeto(cliente);
			//this.persistencia.cierraTrans();


		}	
		finally
		{
			if (tx.isActive())
			{
				tx.rollback();
			}
			pm.close();
		} 

	}


	public void modificarConcepto(ConceptoDTO c) throws Exception{
		PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory("jpox.properties");
		PersistenceManager pm = pmf.getPersistenceManager();
		Transaction tx=pm.currentTransaction();
		try {
			//this.persistencia.AbreTrans();
			tx.begin();
			if (!tx.isActive())tx.begin(); 
			String filter = "descripcion == \""+c.getDescripcion()+"\"";
			Concepto con= (Concepto) this.getObject(pm,Concepto.class,filter);
			con.setDescripcion(c.getDescripcion());
			con.setImporte(c.getImporte());
			con.setPorcentaje(c.getPorcentaje());
			con.setRemunerativo(c.getRemunerativo());
			con.setTipo(c.getTipo());



			tx.commit();
			System.out.println("Concepto Modificada. OK");

		}	
		finally
		{
			if (tx.isActive())
			{
				tx.rollback();
			}
			pm.close();
		} 

	}



	public Vector<ConceptoDTO> getConceptos() throws Exception {
		PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory("jpox.properties");
		PersistenceManager pm = pmf.getPersistenceManager();
		Transaction tx=pm.currentTransaction();
		tx = pm.currentTransaction();

		Vector<ConceptoDTO> vector = new Vector<ConceptoDTO>();
		Collection<Concepto> consultaCol = null;       

		try {
			if (!tx.isActive())tx.begin();
			consultaCol=  this.getObjects(pm,Concepto.class,null);
			Iterator<Concepto> iter = consultaCol.iterator();
			while (iter.hasNext()) {
				Concepto con = iter.next();
				ConceptoDTO catDTO = ConceptoAssembler.getConceptoDTO(con);
				vector.add(catDTO);
			}            
			tx.commit();
		} catch (RuntimeException e) {
			e.printStackTrace();
		} finally {
			if (tx.isActive()) tx.rollback();
		}
		return vector;
	}

	
	 public Concepto getConcepto(String descripcion) throws Exception {
	        PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory("jpox.properties");
	    	PersistenceManager pm = pmf.getPersistenceManager();
	    	Transaction tx=pm.currentTransaction();
	        tx = pm.currentTransaction();
	        
	      //  Vector<ConceptoDTO> vector = new Vector<ConceptoDTO>();
	        Concepto consultaCol = null;       
	        
	        try {
	            if (!tx.isActive())tx.begin();
	            String filter = "descripcion == \""+descripcion+"\""; 
	            consultaCol= (Concepto) this.getObject(pm,Concepto.class,filter);
	           /* Iterator<Concepto> iter = consultaCol.iterator();
	            while (iter.hasNext()) {
	            	Concepto con = iter.next();
	            	ConceptoDTO conDTO = ConceptoAssembler.getConceptoDTO(con);
	            	vector.add(conDTO);
	            } */           
	            tx.commit();
	        } catch (RuntimeException e) {
	        	e.printStackTrace();
	        } finally {
	        	if (tx.isActive()) tx.rollback();
	        }
	        return (Concepto) consultaCol;
	     }

	public Object getObject(PersistenceManager pm,Class clase,String filter) throws Exception{
		Object objetoPersistente = null;
		try {

			Extent clnObject = pm.getExtent(clase, true);
			Query query = pm.newQuery(clnObject,filter);
			Collection objetos = (Collection)query.execute();


			Object[] prueba = objetos.toArray();
			if(prueba.length > 0){
				objetoPersistente = prueba[0];
			}	
		}
		catch (Exception ex) {
			ex.printStackTrace();
			throw ex;           
		}
		return objetoPersistente;
	}

	public Collection getObjects(PersistenceManager pm, Class clase,String filter)throws Exception{
		Collection retorno=null;
		try{
			Class empleadoClass = clase;
			Extent clnEmpleado=pm.getExtent(empleadoClass, false); 
			Query query = pm.newQuery(clnEmpleado,filter);
			retorno=(Collection)query.execute();
		} catch(Exception e) {
			throw e;
		}
		return retorno;
	}

}
